CREATE PROCEDURE SP_CARGA_STAGING_DIM_PRODUTO(
	@DATA DATETIME
)
AS
BEGIN
	DECLARE @DATA_CARGA DATETIME,
			@cdProduto INTEGER,
			@DescricaoProduto VARCHAR(45),
			@Preco DECIMAL(11,2),
			@Estoque INT,
			@DescricaoCategoria VARCHAR(45),
			@Comissao DECIMAL(11,2),
			@Unidade VARCHAR(3),
			@EstoqueMinimo INT,
			@CodigoFabricante VARCHAR(20),
			
			@idProduto_d INTEGER,			
			@cdProduto_d INTEGER,
			@DescricaoProduto_d VARCHAR(45),
			@Preco_d DECIMAL(11,2),
			@Estoque_d INT,
			@DescricaoCategoria_d VARCHAR(45),
			@Comissao_d DECIMAL(11,2),
			@Unidade_d VARCHAR(3),
			@EstoqueMinimo_d INT,
			@CodigoFabricante_d VARCHAR(20),
			@DT_INICIO DATETIME,
			@DT_FIM DATETIME,
			@FL_CORRENTE VARCHAR(3),
				
			@PROCESS INT
						
	DECLARE C_PRODUTO CURSOR FOR 
		SELECT p.DataCarga, p.cdProduto, p.DescricaoProduto, p.Preco, p.Estoque, p.DescricaoCategoria, p.Comissao, p.Unidade, p.EstoqueMinimo, p.CodigoFabricante
		FROM ProdutoAux AS p
		WHERE p.DataCarga = @DATA
	OPEN C_PRODUTO
	FETCH NEXT FROM C_PRODUTO INTO @DATA_CARGA, @cdProduto, @DescricaoProduto, @Preco, @Estoque, @DescricaoCategoria, @Comissao, @Unidade, @EstoqueMinimo, @CodigoFabricante
	WHILE(@@FETCH_STATUS = 0)
	BEGIN
		SELECT @idProduto_d = dp.idProduto,
			   @cdProduto_d = dp.cdProduto,
			   @DescricaoProduto_d = dp.DescricaoProduto,
			   @Preco_d = dp.Preco,
			   @Estoque_d = dp.Estoque,
			   @DescricaoCategoria_d = dp.DescricaoCategoria,
			   @Comissao_d = dp.Comissao,
			   @Unidade_d = dp.Unidade,	
			   @EstoqueMinimo_d = dp.EstoqueMinimo,		   
			   @CodigoFabricante_d = dp.CodigoFabricante,
			   @DT_INICIO = dp.DT_INICIO,
			   @DT_FIM = dp.DT_FIM
		FROM DimProduto AS dp
		WHERE (dp.cdProduto = @cdProduto) AND (dp.dt_fim IS NULL)
		
		IF (@Dt_Inicio IS NULL)
		BEGIN
			SET @DT_INICIO = '19000101'
		END
		IF (@DT_INICIO <> @DATA_CARGA OR @DT_INICIO >= @DATA_CARGA )
		BEGIN
			SET @PROCESS = ISNULL(@idProduto_d,0)
			IF (@PROCESS <> 0)
			BEGIN
				If (@Preco <> @Preco_d AND (NOT (@Preco IS NULL)))
				BEGIN
					UPDATE DimProduto
					SET DT_FIM = @DATA_CARGA, FL_CORRENTE = 'NAO'
					WHERE cdProduto = @cdProduto					
					INSERT INTO DimProduto (cdProduto, DescricaoProduto, Preco, Estoque, DescricaoCategoria, Comissao, Unidade, EstoqueMinimo, CodigoFabricante, DT_INICIO, DT_FIM, FL_CORRENTE)
					VALUES (@cdProduto, @DescricaoProduto, @Preco, @Estoque, @DescricaoCategoria, @Comissao, @Unidade, @EstoqueMinimo, @CodigoFabricante, @DATA_CARGA, NULL, 'SIM');
				END
					
				UPDATE DimProduto
				SET DescricaoProduto = @DescricaoProduto,
					Preco = @Preco,
					Estoque = @Estoque,
					DescricaoCategoria = @DescricaoCategoria,
					Comissao = @Comissao,
					Unidade = @Unidade,
					EstoqueMinimo = @EstoqueMinimo,
					CodigoFabricante = @CodigoFabricante					 
				WHERE cdProduto = @cdProduto
			END	
			ELSE
			BEGIN
				IF ((NOT (@DescricaoProduto IS NULL OR @Preco IS NULL)) AND 
				   (NOT (@Estoque IS NULL OR @DescricaoCategoria IS NULL OR @Comissao IS NULL OR @Unidade IS NULL OR 
				   @EstoqueMinimo IS NULL OR @CodigoFabricante IS NULL )))
				BEGIN
				INSERT INTO DimProduto (cdProduto, DescricaoProduto, Preco, Estoque, DescricaoCategoria, Comissao, Unidade, EstoqueMinimo, CodigoFabricante, DT_INICIO, DT_FIM, FL_CORRENTE)
					VALUES (@cdProduto, @DescricaoProduto, @Preco, @Estoque, @DescricaoCategoria, @Comissao, @Unidade, @EstoqueMinimo, @CodigoFabricante, @DATA_CARGA, NULL, 'SIM');
				END
			END	
		END
		FETCH NEXT FROM C_PRODUTO INTO @DATA_CARGA, @cdProduto, @DescricaoProduto, @Preco, @Estoque, @DescricaoCategoria, @Comissao, @Unidade, @EstoqueMinimo, @CodigoFabricante
	END
	CLOSE C_PRODUTO
	DEALLOCATE C_PRODUTO
END;
GO

SET DATEFORMAT DMY
EXEC SP_CARGA_STAGING_DIM_PRODUTO '16/07/2012'

SELECT * FROM DimProduto
